import pandas as pd
# 引入pandas库
import matplotlib.pyplot as plt
# 引入matplotlib.pyplot库
import numpy as np
# 引入numpy库


# 分析表格sheet1中的数据并可视化为饼状图
df = pd.read_excel('全国人口普查数据.xlsx', header=0, sheet_name='Sheet1')
# 读取表格中sheet1的数据
regions = df.iloc[0, 1:5].tolist()
population = df.iloc[1, 1:5].tolist()
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
# 计算每个区域所占的百分比
total_population = sum(population)
percentages = [p / total_population * 100 for p in population]
fig, ax = plt.subplots()
ax.pie(percentages, labels=regions, autopct=lambda p: '{:.4f}%'.format(p),
       startangle=90, explode=(0, 0.4, 0.8, 1.2))
# 防止数据堆叠，将每块数据距离中心点的距离进行调整
ax.set_title('2020人口普查全国总人口', fontsize=16)
ax.axis('equal')
# 保证输出为圆形
ax.legend(loc='upper right', bbox_to_anchor=(1.1, 1.05))
plt.show()


# 分析表格sheet2中的数据并可视化为柱状图
df = pd.read_excel('全国人口普查数据.xlsx', header=0, sheet_name='Sheet2')
# 读取表格中sheet2的数据
x_axis = df.iloc[0, 1:8].tolist()
y_axis = df.iloc[1, 1:8].tolist()
plt.figure(figsize=(10, 6))
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.bar(x_axis, y_axis, 5, color='Coral', label='全国人口（万人）')
plt.title('历次普查全国人口', fontsize=16)
plt.xlabel('普查年份', fontsize=10)
plt.ylabel('全国人口（万人）', fontsize=10)
plt.xticks(x_axis)
plt.yticks(y_axis)
plt.legend()
plt.grid(True)
# 输出网格线
plt.xticks(rotation=45)
# x轴标签过长，旋转以更好显示
plt.show()


# 分析表格sheet3中的数据并可视化为折线图
df = pd.read_excel('全国人口普查数据.xlsx', header=0, sheet_name='Sheet3')
# 读取表格中sheet3的数据
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
years = df.iloc[0, 1:8].tolist()
growth_rates = df.iloc[1, 1:8].tolist()
plt.figure(figsize=(10, 6))  # 设置图形大小#
plt.plot(years, growth_rates, color='b', marker='o')  # 绘制折线图，并使用圆圈作为数据点标记
plt.title('年均增长率折线图', fontsize=18)
plt.xlabel('普查年份', fontsize=10)
plt.ylabel('年均增长率（%）', fontsize=10)
plt.yticks([])
for x, y in zip(years[1:], growth_rates[1:]):
    if y < 4:
        # 只标注在y轴范围内的数据点
        plt.annotate(f'{y:.2f}', (x, y), textcoords="offset points", xytext=(0, 10), ha='center')
# 由于第一个年均增长率缺失，选择不显示它
# 通过在绘制时排除第一个点
plt.gca().lines[0].set_xdata(years[1:])
plt.gca().lines[0].set_ydata(growth_rates[1:])
plt.show()


# 分析表格sheet4中的数据并可视化为折线加柱状图
df = pd.read_excel('全国人口普查数据.xlsx', header=0, sheet_name='Sheet4')
# 读取表格中sheet4的数据
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
date = df.iloc[0, 1:8].tolist()
date = list(map(int, date[:]))
# 将列表中获得的数据转换为整数
man = df.iloc[1, 1:8].tolist()
woman = df.iloc[2, 1:8].tolist()
rate = df.iloc[3, 1:8].tolist()
x = np.arange(len(date))
plt.bar(date, man, 3, label='男', color='Coral', alpha=0.8)
plt.bar(date, woman, 6, label='女', color='LemonChiffon', alpha=0.8)
# 在左侧显示图例
plt.legend(loc="upper left")
plt.xticks(date)
# 设置标题
plt.title("历次普查人口性别构成", fontsize=18)
# 为两条坐标轴设置名称
plt.xlabel("普查年份", fontsize=10)
plt.ylabel("人口总数（万人）", fontsize=10)
# 画折线图
ax2 = plt.twinx()
ax2.set_ylabel("性别比（%）")
# 设置坐标轴范围
ax2.set_ylim([105, 110])
plt.plot(date, rate, "r", marker='.', ms=5, linewidth='1', label="性别比（%）")
# 显示数字
for a, b in zip(date, rate):
    plt.text(a, b, b, ha='center', va='bottom', fontsize=8)
# 在右侧显示图例
plt.legend(loc="upper right")
plt.grid(True)
plt.show()


print("已正确输出所有图示")
